Specs2をGradleで使う
概要
Scalaのテストツール Specs2をGradleから使おうとした時に
つまづいたのでまとめまでに。
Specs2以外のテストツール、Scalatestだと解りやすかった
ScalatestをGradleから使う方法
Scalatestのユニットテストはこんな感じ。
import org.scalatest.FunSuite
class SampleTests extends FunSuite {
test("Something") {
val a = List("A", "B")
val b = Seq("A", "B")
assert(a == b)
}
}
こいつを起動する事ができればOK
Gradleのtestタスクを上書きして、Scalatestを実行できれば良い。
例えばtestタスクをこんな感じにするとOK。
task test(overwrite: true, dependsOn: testClasses) << {
ant.taskdef(name: 'scalatest',
classname: 'org.scalatest.tools.ScalaTestAntTask',
classpath: sourceSets.test.runtimeClasspath.asPath
)
ant.scalatest(runpath: 'build/classes/test',
haltonfailure: 'true',
fork: 'false') {reporter(type: 'stdout')}
}
タスク testClassesに依存する形で、
このタスクを実行するとまずtestClassesが実行されて、
次にantTaskとしてscalatestというのを定義、
そのままパスを与えて実行する。
インプットできるパラメータとかを明示してくれていて使いやすい。
で、Specs2
勝手が分かんなかったので、
死霊を見るに、
Specs2の死霊
http://etorreborre.github.com/specs2/guide/org.specs2.UserGuide.html#User+Guide
→Specification をextendsしたテストを書いて、タスク testで実行するようにすればよさげ。
試しに小さなテストを書いて、Gradleから実行してみる事にした。
build.gradle側記述
dependenciesに下記を記述
testCompile (
[group: 'junit', name:'junit', version:'4.5'],
[group: "org.specs2", name: "specs2_2.9.2", version:"1.12.1"],
[group: 'org.specs2', name: 'specs2-scalaz-core_2.9.1',version:'6.0.1'],
)
テストクラスの内容は下記
package com.kissaki
import org.specs2.mutable._
import org.specs2.runner.JUnitRunner
import org.junit.runner.RunWith
@RunWith(classOf[JUnitRunner])
class SampleTests extends Specification {
"Some test for my specs2 understand" should {
"same-check between List & Seq" in {
val a = List("A","B")
val b = Seq("A","B")
a == b must beTrue
}
}
}
これらを整えた状態で、
gradle test
とやると、依存性解決してこんな感じになると思う。
いつも通りGradleによるテストのreportsも作られてる。
中身はこんな感じ。
htmlを吐く機能が付いてるんだけど、どっちかって言うとGradleが吐く奴の方が
見た目にはすっきりしてて一次情報としてはうれしい感じ。
ここに嵌った
runner.RunWithインポートするの忘れてて、1時間くらい無駄にした。
サンプルプロジェクト
https://github.com/sassembla/ScalaSpecs2WithGradle